package com.jiruan.invoicemanagementsystem.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Objects;
import java.util.Scanner;

@SuppressWarnings("all")
public class PrintAndInputTools {
    static Scanner sc = new Scanner(System.in);

    //美化打印格式
    /// 根据设定参数决定打出的'\t'数量
    /// 如果 给定数据(newNum)的长度 小于 指定长度(limit)
    /// 则根据spacial的值来决定打印'\t'的数量
    /// 否则根据normal的值来决定打印'\t'的数量
    public static void judgeWei(Integer newNum, int limit, int normal, int spacial) {
        int count = 0;
        while (newNum / 10 != 0) {
            newNum = newNum / 10;
            count++;
        }
        if (count + 1 <= limit) {
            for (int i = 0; i < spacial; i++) {
                System.out.print("\t");
            }
        } else {
            for (int i = 0; i < normal; i++) {
                System.out.print("\t");
            }
        }
    }

    //翻页
    /// 根据选项判断翻页
    public static PageHelper judgePage(String choice2, PageHelper ph, String upSign, String downSign) {
        try {
            if (downSign.equals(choice2)) {
                if (Objects.equals(ph.getPageIndex(), ph.getPageCount())) {
                    Thread.sleep(1000);
                    System.out.println("-----------------------------------------------");
                    System.out.println("-----------------不能向下翻了--------------------");
                    Thread.sleep(1000);
                } else {
                    //向上翻页
                    ph.setPageIndex(ph.getPageIndex() + 1);
                }
            } else if (upSign.equals(choice2)) {
                if (ph.getPageIndex() == 1) {
                    Thread.sleep(1000);
                    System.out.println("-----------------------------------------------");
                    System.out.println("-----------------不能向上翻了--------------------");
                    Thread.sleep(1000);
                } else {
                    //向下翻页
                    ph.setPageIndex(ph.getPageIndex() - 1);
                }
            } else {
                Thread.sleep(1000);
            }
        } catch (Exception ignored) {
        }
        return ph;
    }

    //安全输入"Integer"
    /// 绝对返回输入的Int类型
    public static Integer absolutBackIntInput(String tips) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.print(tips);       //提示用户输入
            try {
                String input = br.readLine();
                return Integer.parseInt(input);
            } catch (NumberFormatException e) {
                System.out.println("===您的输入不正确,请输入一个整数===");
            } catch (Exception e) {
                System.out.println("=======你在输什么东西!重来!=======");
            }
        }
    }

    //输入指定长度的账号数据
    /// 返回用户名
    ///
    /// @ min-max 位
    public static String getRegisterUserName(int min, int max) {
        //用户名:只能数字组成,要求min-max位
        while (true) {
            System.out.print("请输入您要注册的用户名:");
            String userName = sc.next();
            //判断
            if (userName.length() < min) {
                System.out.println("您输入的用户名不符合要求,最低不少于" + min + "位!");
                continue;
            }
            if (userName.length() > max) {
                System.out.println("您输入的用户名不符合要求,最高不超过" + max + "位!");
                continue;
            }
            //判断是不是纯数字
            boolean judgeNumber = true;
            for (char c : userName.toCharArray()) {
                if (!(c >= '0' && c <= '9')) {
                    judgeNumber = false;
                    break;
                }
            }
            if (!judgeNumber) {
                System.out.println("用户名必须是纯数字!!!!");
                continue;
            }
            return userName;
        }
    }

    //输入指定长度范围的密码数据
    /// 返回密码
    ///
    /// @ min-max 位
    /// @必须含有字母
    public static String getRegisterUserPassword(int min, int max) {
        //密码:只能数字组成,要求min-max位
        while (true) {
            System.out.print("请输入您要注册的密码:");
            String userPassword = sc.next();
            //判断
            if (userPassword.length() < min) {
                System.out.println("您输入的用户名不符合要求,最低不少于" + min + "位!");
                continue;
            }
            if (userPassword.length() > max) {
                System.out.println("您输入的用户名不符合要求,最高不超过" + max + "位!");
                continue;
            }
            //判断是不是数字加字母
            boolean judgeNumber = true;
            for (char c : userPassword.toCharArray()) {
                if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'z') && !(c >= 'A' && c <= 'Z')) {
                    judgeNumber = false;
                    break;
                }
            }
            if (!judgeNumber) {
                System.out.println("密码必须由数字和字母组成!!!!");
                continue;
            }
            //判断有没有字母
            boolean ishave = false;
            for (char c : userPassword.toCharArray()) {
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                    ishave = true;
                    break;
                }
            }
            if (!ishave) {
                System.out.println("密码必须含有字母!!!!");
                continue;
            }
            return userPassword;
        }
    }

    //字符加密
    /**
     * 字符串加密与解密
     * @Params str: 待加密/解密的字符串
     *      效果:将字符串加密为不可理解的神秘文本
     * */
    public static String getEncryptionMessage(String str) {
        StringBuilder backStr = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char tempC = str.charAt(i);
            tempC = (char) (tempC ^ 8);
            backStr.append(tempC);
        }
        return backStr.toString();
    }
    //字符解密
    public static String getDeclassificationMessage(String str) {
        return getEncryptionMessage(str);
    }

    //规定输入池限制
    /**
     *  @ tips: 输入的提示语句     (Eg:请输入库存名称)
     * @ String...strS: 限制用户输入的内容池      (Eg: strS = {水产,灰产,常温,冷冻} ,
     *                                             则用户只能输入这里面的数据)
     * */
    public static String absolutBackLimitStringInput(String tips, String... strS) {
        StringBuilder tipString = new StringBuilder("[");
        int count = 0;
        for (String str : strS) {
            if (count == strS.length - 1) {
                tipString.append(str).append("]");
            } else {
                tipString.append(str).append("/");
            }
            count++;
        }
        System.out.print(tips + ":\n\t-(请输入" + tipString + "):");
        String wareHouseName = sc.next();
        //规定输入内容的限制
        boolean judgeInput = true;
        String[] tempInputPoolString = tipString.toString().split("/");
        while (judgeInput) {
            for (String s : tempInputPoolString) {
                if (s.equals(wareHouseName) || s.equals("[" + wareHouseName) || s.equals(wareHouseName + "]")) {
                    judgeInput = false;
                    break;
                }
            }
            if (judgeInput) {
                System.out.print("您输入的不符合要求,请重新输入:\n\t-(请输入" + tipString + "):");
                wareHouseName = sc.next();
            }
        }
        return wareHouseName;
    }

    //检查数字数组排序是否正确
    /**
     * @param flag 决定判断排序de方式 -> 如果flag = true:则从小到大,否则从大到小
     *
     * */
    public static boolean checkSort(int[] arr, boolean flag) {
        if(flag){
            boolean judge1 = true;
            //判断 从小到大排序 是否有未成功排序的
            for(int i = 0; i < arr.length-2; i++){
                if (arr[i] > arr[i + 1]) {
                    judge1 = false;
                    break;
                }
            }
            return judge1;
        }else{
            boolean judge2 = true;
            //判断 从大到小排序 是否有未成功排序的
            for(int i = 0; i < arr.length-2; i++){
                if (arr[i] < arr[i + 1]) {
                    judge2 = false;
                    break;
                }
            }
            return judge2;
        }
    }

    //规定输入格式 %?%?
    /// 绝对返回指定格式的String类型
    ///
    /// @Params Format: 格式形如"3省6市"
    ///         效果：1.限制省之前的文本长度<=3，省之后,市之前的文本长度<=6
    ///              2.且必须含有省市,并且省在市前方
    public static String absolutBackStringFormatInput(String tips,String Format) {
        //寻找分割文本
        StringBuilder strS = new StringBuilder();
        //寻找数量文本
        StringBuilder strN = new StringBuilder();
        for (int i = 0; i < Format.length(); i++) {
            //如果不是0-9数字,则是分割字符
            if (!(Format.charAt(i) > '0' && Format.charAt(i) <= '9')) {
                //加入到StringBuilder  *'&'为分割标志*
                strS.append(Format.charAt(i)).append("&");
            } else {
                //是数字
                strN.append(Format.charAt(i)).append("&");
            }
        }
        //得到分割文本    Eg: ... 省 & 市 & ...
        String[] strSTemp = strS.toString().split("&");
        //得到数字文本    Eg  ... 3 & 6 & ...
        String[] strNTemp = strN.toString().split("&");
        while(true){
            //提示用户输入
            System.out.print(tips);
            String userInput = sc.next();
            //查找分割文本在userInput中的下标
            int count = 0;
            int index = 0;
            int[] indexS =  new int[strSTemp.length];
            for(char c : userInput.toCharArray()) {
                if(c == strSTemp[count].toCharArray()[0]) {
                    indexS[count] = index;
                    count++;
                }
                index++;
            }
            count = 0;
            index = 0;
            //查找数字的下标
            int[] inputNTemp =  new int[strNTemp.length];
            for(char c : userInput.toCharArray()) {
                if(c != strSTemp[count].toCharArray()[0]) {
                    index++;
                }else{
                    inputNTemp[count] = index;
                    index = 0;
                    count++;
                }
            }
            //判断数字是否完全满足
            boolean numberJudge = true;
            for(int i = 0; i < strNTemp.length; i++) {
                if(Integer.parseInt(strNTemp[i]) < inputNTemp[i]){
                    numberJudge = false;
                    break;
                }
            }
            //判断下标顺序正不正确
            if(checkSort(indexS,true) && numberJudge){
                //对劲
                return userInput;
            }else{
                //不对劲
                System.out.print("您输入的格式不对,应该为: (");
                for(int i = 0; i < strSTemp.length; i++){
                    for(int j = 0; j < Integer.parseInt(strNTemp[i]); j++){
                        System.out.print('x');
                    }
                    System.out.print(strSTemp[i]);
                }
                System.out.println(")");
            }
        }
    }


}
